package c05面向对象;

public class 继承树中初始化块和构造器的调用顺序 {
	public static void main(String[] args) {
		new Leaf();
	}
}

class Root {
	static {
		System.err.println("Root的静态初始化块");
	}

	public Root() {
		System.err.println("Root的无参数的构造器");
	}

	{
		System.err.println("Root的普通初始化块");
	}
}

class Mid extends Root {
	static {
		System.err.println("Mid的静态初始化块");
	}

	{
		System.err.println("Mid的普通初始化块");
	}

	public Mid() {
		System.err.println("Mid的无参数的构造器");
	}

	public Mid(String msg) {
		//通过this调用同一类中重载的构造器
		this();
		System.err.println("Mid的带参数构造器，其参数值："
				+ msg);
	}
}

class Leaf extends Mid {
	static {
		System.err.println("Leaf的静态初始化块");
	}

	{
		System.err.println("Leaf的普通初始化块");
	}

	public Leaf() {
		//通过super调用父类中有一个字符串参数的构造器
		super("疯狂Java讲义");
		System.err.println("执行Leaf的构造器");
	}
}
